IntroduciĂ³n
El presente archivo es un informe sobre el manejo de datos obtenidos por parte de la empresa ExelPitss. La infromacion que se nos fue proporcionada es realcionda con las diferentes solicitudes de trabajo, cada una de ellas cuenta con los datos de empresa necesario, modelos y las personas involucradas en la resolucion de la solicitud, pero, como dato principal se encontraban diferentes tipos de tiempos, desde tiempos de respuesta a la solucitud, hasta el tiempo que se necesito en la zona de trabajo para cumplir con los encargos. Tras el analisis exploratorio mediante la limpieza de los datos dados, se procedio a la busqeuda de un modelado del comportamieto en los tiempos de recepcion y tiempos limintes de respuesta, esto con el objetivo de presentar informacion relevante para la empresa y pudan tomar mejores decisiones a futuro, relacionadas con esta investigacion.
Desarrollo
GrĂ¡ficas del anĂ¡lisis exploratorio


Comparaciones del uso de los tiempos por los ingenieros en los estados de Jalisco y Nuevo LeĂ³n
Comparaciones por estado del tiempo que tomĂ³ responder una solicitud
GrĂ¡ficas por estado del tiempo que trabaja el ingeniero en el lugar que se solicitĂ³
GrĂ¡fica que muestra la relaciĂ³n entre el tiempo de respuesta y el lĂmite de tiempo restante, valores mĂ¡s altos del coeficiente significa que se usĂ³ mĂ¡s tiempo para solucionar el problema
GrĂ¡ficas de los estados en donde en promedio se usĂ³ mĂ¡s de la mitad del tiempo asignado para atender la solicitud. Pueden observarse casos en donde los valores son muy atĂpicos, principalmente en casos de hace 2 o 3 años. TambiĂ©n hay casos como Puebla en donde una significativa cantidad de veces se usa mucho tiempo para atender una solicitud, puede deberse a que el ingeniero deba desplazarse desde otro estado o a factores externos.
GrĂ¡fica que muestra los estados en donde se usĂ³ mĂ¡s tiempo del asignado para resolver la solicitud, se puede observar que los excesos de tiempo son anteriores a agosto de 2019, sin embargo aĂºn los datos se encuentran de manera general por encima del 0.5
Estados en donde se necesitĂ³ en promedio la mitad o menos del tiempo asignado para responder una solicitud
Busqueda de correlaciones
La siguiente tabla nos muestra un comportamiento sencillo de las varaibles al interactuar entre si, esto con el proposito de darnos una idea general de las posibles correlaciones que podrĂan existir, y de esta forma asegurarnos que no fueran causadas por el azar. El primer analisis que decidimos realizar, para intentar observar alguna relacion posible con otro dato, fue en las ordenes de servicio que no fueron atendidas en el tiempo asignado.


Call:corr.test(x = correlacion_tiempos2_Fals, method = "spearman",
adjust = "none")
Correlation matrix
Tiempo efectivo en sitio
Tiempo efectivo en sitio 1.0
Tiempo de respuesta -1.0
Limite tiempo de soluciĂ³n total -0.5
Tiempo de respuesta
Tiempo efectivo en sitio -1.0
Tiempo de respuesta 1.0
Limite tiempo de soluciĂ³n total 0.5
Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio -0.5
Tiempo de respuesta 0.5
Limite tiempo de soluciĂ³n total 1.0
Sample Size
[1] 3
Probability values (Entries above the diagonal are adjusted for multiple tests.)
Tiempo efectivo en sitio
Tiempo efectivo en sitio 0.00
Tiempo de respuesta 0.00
Limite tiempo de soluciĂ³n total 0.67
Tiempo de respuesta
Tiempo efectivo en sitio 0.00
Tiempo de respuesta 0.00
Limite tiempo de soluciĂ³n total 0.67
Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio 0.67
Tiempo de respuesta 0.67
Limite tiempo de soluciĂ³n total 0.00
To see confidence intervals of the correlations, print with the short=FALSE option
Resultado de las correlaciones entre los tiempos, de las ordenes de servicio que fueron atendidas en el tiempo asignado


Call:corr.test(x = correlacion_tiempos2_True, method = "spearman",
adjust = "none")
Correlation matrix
Tiempo efectivo en sitio
Tiempo efectivo en sitio 1.0
Tiempo de respuesta -0.5
Limite tiempo de soluciĂ³n total -1.0
Tiempo de respuesta
Tiempo efectivo en sitio -0.5
Tiempo de respuesta 1.0
Limite tiempo de soluciĂ³n total 0.5
Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio -1.0
Tiempo de respuesta 0.5
Limite tiempo de soluciĂ³n total 1.0
Sample Size
[1] 3
Probability values (Entries above the diagonal are adjusted for multiple tests.)
Tiempo efectivo en sitio
Tiempo efectivo en sitio 0.00
Tiempo de respuesta 0.67
Limite tiempo de soluciĂ³n total 0.00
Tiempo de respuesta
Tiempo efectivo en sitio 0.67
Tiempo de respuesta 0.00
Limite tiempo de soluciĂ³n total 0.67
Limite tiempo de soluciĂ³n total
Tiempo efectivo en sitio 0.00
Tiempo de respuesta 0.67
Limite tiempo de soluciĂ³n total 0.00
To see confidence intervals of the correlations, print with the short=FALSE option
Las siguientes tablas contienen correlaciones especificas: LRespuesta_TRespuesta_Cor, que consta de las variables Tiempo de respuesta y Limite de tiempo de respuesta, en seguida estĂ¡ la columna Canvisitas_TRespuesta_Cor, que se constituye de las variablescant_visitas y Tiempo de respuesta. Las correlaciones se hacen con el modelo de Spearman, utilizando los datos que tienen un coeficiente de tiempo de respuesta y limite de tiempo de respuestas mayor o igual a 1 (eso quiere decir que utilizaron un mayor tiempo al asignado). Las 3 tablas no muestran correlaciones fiables o que podamos tomar como una correlaciĂ³n vĂ¡lida, en algunos casos esto se debe a la naturaleza de los mismos datos, adicional a esto, se puede ver que no existen correlaciones lineales entre las variables utilizadas.
Series de tiempo
components(dcmp_Jal) %>% autoplot()+ xlab("Meses")

components(dcmp_Jal_sem) %>% autoplot()+ xlab("Semanas")

Modelos
Train_tsb %>%
filter(Ruta == "JALISCO") %>%
features(Tiempo_de_respuesta,unitroot_kpss)
Train_tsb %>%
filter(Ruta == "JALISCO") %>%
features(Tiempo_de_respuesta, unitroot_ndiffs)
Train_tsb %>%
filter(Ruta == "JALISCO") %>%
features(Tiempo_de_respuesta, unitroot_nsdiffs)
Train_tsb %>%
filter(Ruta == "JALISCO") %>%
mutate(dif = difference(Tiempo_de_respuesta)) %>%
features(dif,unitroot_kpss)
Train_tsb %>%
filter(Ruta == "JALISCO") %>%
mutate(Tiempo_de_respuesta = difference(Tiempo_de_respuesta, differences = 1)) %>%
gg_tsdisplay(plot_type = 'partial')

Modelos_fit %>%
select(ARIMA_fourier2) %>%
report()
Series: Tiempo_de_respuesta
Model: LM w/ ARIMA(2,1,0) errors
Coefficients:
ar1 ar2 fourier(K = 2)C1_52 fourier(K = 2)S1_52
-0.4756 -0.3693 0.2428 -0.052
s.e. 0.0783 0.0778 0.1858 0.181
fourier(K = 2)C2_52 fourier(K = 2)S2_52
0.0564 -0.0241
s.e. 0.0925 0.0935
sigma^2 estimated as 0.1191: log likelihood=-47.19
AIC=108.39 AICc=109.23 BIC=129.03
Grafica del test de los modelos
Modelos_fc %>%
# filter(.model == "ARIMA_fourier2") %>%
# autoplot(filter_index(Train_tsb, "2020-01-01" ~ "2020-12-06")) +
autoplot(filter_index(Train_tsb, "2020-01-01" ~ "2020-12-06"), level = NULL) +
ggtitle("Entrenamiento") +
xlab("Años") + ylab("horas") +
guides(colour=guide_legend(title="Forecast"))+
geom_vline(xintercept = as.Date("2020-11-08"), color = "Red",
linetype = "dashed")+
annotate("label", x = c(as.Date("2020-08-01"),as.Date("2020-12-01")),
y = 3.5, label = c("Train set", "Test set"),
color = c("black","blue"))
Error: Provided data contains a different key structure to the forecasts.
Run `rlang::last_error()` to see where the error occurred.

Analisis estadistico de los modelos
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyB5IE1vZGVsb3MiDQpzdWJ0aXRsZTogIkluZm9ybWUgZGUgbG9zIHRpZW1wb3MgZGUgcmVjZXBjacOzbiB5IHRpZW1wbyBsaW1pdGUgZGUgcmVzcHVlc3RhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgSW50cm9kdWNpw7NuIA0KDQpFbCBwcmVzZW50ZSBhcmNoaXZvIGVzIHVuIGluZm9ybWUgc29icmUgZWwgbWFuZWpvIGRlIGRhdG9zIG9idGVuaWRvcyBwb3IgcGFydGUgZGUgbGEgZW1wcmVzYSAqKkV4ZWxQaXRzcyoqLiANCkxhIGluZnJvbWFjaW9uIHF1ZSBzZSBub3MgZnVlIHByb3BvcmNpb25hZGEgZXMgcmVhbGNpb25kYSBjb24gbGFzIGRpZmVyZW50ZXMgc29saWNpdHVkZXMgZGUgdHJhYmFqbywgY2FkYSB1bmEgZGUgZWxsYXMgY3VlbnRhIGNvbiBsb3MgZGF0b3MgZGUgZW1wcmVzYSBuZWNlc2FyaW8sIG1vZGVsb3MgeSBsYXMgcGVyc29uYXMgaW52b2x1Y3JhZGFzIGVuIGxhIHJlc29sdWNpb24gZGUgbGEgc29saWNpdHVkLCBwZXJvLCBjb21vIGRhdG8gcHJpbmNpcGFsIHNlIGVuY29udHJhYmFuIGRpZmVyZW50ZXMgdGlwb3MgZGUgdGllbXBvcywgZGVzZGUgdGllbXBvcyBkZSByZXNwdWVzdGEgYSBsYSBzb2x1Y2l0dWQsIGhhc3RhIGVsIHRpZW1wbyBxdWUgc2UgbmVjZXNpdG8gZW4gbGEgem9uYSBkZSB0cmFiYWpvIHBhcmEgY3VtcGxpciBjb24gbG9zIGVuY2FyZ29zLg0KVHJhcyBlbCBhbmFsaXNpcyBleHBsb3JhdG9yaW8gbWVkaWFudGUgbGEgbGltcGllemEgZGUgbG9zIGRhdG9zIGRhZG9zLCBzZSBwcm9jZWRpbyBhIGxhIGJ1c3FldWRhIGRlIHVuIG1vZGVsYWRvIGRlbCBjb21wb3J0YW1pZXRvIGVuIGxvcyB0aWVtcG9zIGRlIHJlY2VwY2lvbiB5IHRpZW1wb3MgbGltaW50ZXMgZGUgcmVzcHVlc3RhLCBlc3RvIGNvbiBlbCBvYmpldGl2byBkZSBwcmVzZW50YXIgaW5mb3JtYWNpb24gcmVsZXZhbnRlIHBhcmEgbGEgZW1wcmVzYSB5IHB1ZGFuIHRvbWFyIG1lam9yZXMgZGVjaXNpb25lcyBhIGZ1dHVybywgcmVsYWNpb25hZGFzIGNvbiBlc3RhIGludmVzdGlnYWNpb24uDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0Kc291cmNlKCJMaW1waWV6YS5SIiwgDQogICAgICAgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSwNCiAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIpDQpzb3VyY2UoImxpbXBpZXphX3JlcG9ydGVfVGllbXBvX3Jlc3B1ZXN0YS5SIiwgDQogICAgICAgbG9jYWwgPSBrbml0cjo6a25pdF9nbG9iYWwoKSwNCiAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIpDQpzb3VyY2UoIk1vZGVsb3MuUiIsIA0KICAgICAgIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCksDQogICAgICAgZW5jb2RpbmcgPSAidXRmLTgiKQ0KYGBgDQoNCg0KDQojIERlc2Fycm9sbG8gDQojIyBHcsOhZmljYXMgZGVsIGFuw6FsaXNpcyBleHBsb3JhdG9yaW8NCmBgYHtyIGVjaG89RkFMU0V9DQp0aWVtcG9zX29zX3RpZHlfdGJsICU+JQ0KICBmaWx0ZXIoUnV0YSA9PSAiSkFMSVNDTyIsDQogICAgICAgICBUaWVtcG9zICVpbiUgYygiVGllbXBvIGVmZWN0aXZvIGVuIHNpdGlvIiwgIlRpZW1wbyBkZSByZXNwdWVzdGEiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGBUw6ljbmljbyBkZSB2aXNpdGFgLCB5ID0gaG9yYV9kZWNpbWFsLCBmaWxsID0gVGllbXBvcykpKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGZhY2V0X2dyaWQoUnV0YSB+IFRpZW1wb3MsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBnZ3RpdGxlKCJBbmFsaXNpcyBkZSBsb3MgdGVjbmljb3MgZGUgdmlzaXN0YSB5IHN1cyB0aWVtcG9zIGRlIHJlc3B1ZXN0YSIpKw0KICBjb29yZF9mbGlwKCkNCg0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQp0aWVtcG9zX29zX3RpZHlfdGJsICU+JQ0KICBmaWx0ZXIoVGllbXBvcyAlaW4lIGMoIlRpZW1wbyBlZmVjdGl2byBlbiBzaXRpbyIsICJUaWVtcG8gZGUgcmVzcHVlc3RhIikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBSdXRhLCB5ID0gaG9yYV9kZWNpbWFsLCBmaWxsID0gVGllbXBvcykpKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGZhY2V0X3dyYXAofiBUaWVtcG9zLCBzY2FsZXMgPSAiZnJlZV94IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiQW5hbGlzaXMgZGUgbG9zIHRpZW1wb3MgZGUgcmVzcHVlc3RhIGRlIGxhcyBydXRhcyIpKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KcGxvdGx5OjpnZ3Bsb3RseShDb21wX0phbF9OTCkNCmBgYA0KQ29tcGFyYWNpb25lcyBkZWwgdXNvIGRlIGxvcyB0aWVtcG9zIHBvciBsb3MgaW5nZW5pZXJvcyBlbiBsb3MgZXN0YWRvcyBkZSBKYWxpc2NvIHkgTnVldm8gTGXDs24NCg0KYGBge3IsZWNobz1GQUxTRX0NCnBsb3RseTo6Z2dwbG90bHkoVFJfcnV0YSkNCmBgYA0KQ29tcGFyYWNpb25lcyBwb3IgZXN0YWRvIGRlbCB0aWVtcG8gcXVlIHRvbcOzIHJlc3BvbmRlciB1bmEgc29saWNpdHVkDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpwbG90bHk6OmdncGxvdGx5KFRFX3J1dGEpDQpgYGANCkdyw6FmaWNhcyBwb3IgZXN0YWRvIGRlbCB0aWVtcG8gcXVlIHRyYWJhamEgZWwgaW5nZW5pZXJvIGVuIGVsIGx1Z2FyIHF1ZSBzZSBzb2xpY2l0w7MNCg0KYGBge3IsZWNobz1GQUxTRX0NCnBsb3RseTo6Z2dwbG90bHkoUGVyUl9ydXRhKQ0KYGBgDQpHcsOhZmljYSBxdWUgbXVlc3RyYSBsYSByZWxhY2nDs24gZW50cmUgZWwgdGllbXBvIGRlIHJlc3B1ZXN0YSB5IGVsIGzDrW1pdGUgZGUgdGllbXBvIHJlc3RhbnRlLCB2YWxvcmVzIG3DoXMgYWx0b3MgZGVsIGNvZWZpY2llbnRlIHNpZ25pZmljYSBxdWUgc2UgdXPDsyBtw6FzIHRpZW1wbyBwYXJhIHNvbHVjaW9uYXIgZWwgcHJvYmxlbWENCg0KYGBge3IsZWNobz1GQUxTRX0NCnBsb3RseTo6Z2dwbG90bHkoY29jaWVudGVfcnV0YSkNCmBgYA0KR3LDoWZpY2FzIGRlIGxvcyBlc3RhZG9zIGVuIGRvbmRlIGVuIHByb21lZGlvIHNlIHVzw7MgbcOhcyBkZSBsYSBtaXRhZCBkZWwgdGllbXBvIGFzaWduYWRvIHBhcmEgYXRlbmRlciBsYSBzb2xpY2l0dWQuIFB1ZWRlbiBvYnNlcnZhcnNlIGNhc29zIGVuIGRvbmRlIGxvcyB2YWxvcmVzIHNvbiBtdXkgYXTDrXBpY29zLCBwcmluY2lwYWxtZW50ZSBlbiBjYXNvcyBkZSBoYWNlIDIgbyAzIGHDsW9zLiBUYW1iacOpbiBoYXkgY2Fzb3MgY29tbyBQdWVibGEgZW4gZG9uZGUgdW5hIHNpZ25pZmljYXRpdmEgY2FudGlkYWQgZGUgdmVjZXMgc2UgdXNhIG11Y2hvIHRpZW1wbyBwYXJhIGF0ZW5kZXIgdW5hIHNvbGljaXR1ZCwgcHVlZGUgZGViZXJzZSBhIHF1ZSBlbCBpbmdlbmllcm8gZGViYSBkZXNwbGF6YXJzZSBkZXNkZSBvdHJvIGVzdGFkbyBvIGEgZmFjdG9yZXMgZXh0ZXJub3MuDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpwbG90bHk6OmdncGxvdGx5KEVUX3J1dGEpDQoNCmBgYA0KR3LDoWZpY2EgcXVlIG11ZXN0cmEgbG9zIGVzdGFkb3MgZW4gZG9uZGUgc2UgdXPDsyBtw6FzIHRpZW1wbyBkZWwgYXNpZ25hZG8gcGFyYSByZXNvbHZlciBsYSBzb2xpY2l0dWQsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsb3MgZXhjZXNvcyBkZSB0aWVtcG8gc29uIGFudGVyaW9yZXMgYSBhZ29zdG8gZGUgMjAxOSwgc2luIGVtYmFyZ28gYcO6biBsb3MgZGF0b3Mgc2UgZW5jdWVudHJhbiBkZSBtYW5lcmEgZ2VuZXJhbCBwb3IgZW5jaW1hIGRlbCAwLjUNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpwbG90bHk6OmdncGxvdGx5KFRPX3J1dGEpDQpgYGANCkVzdGFkb3MgZW4gZG9uZGUgc2UgbmVjZXNpdMOzIGVuIHByb21lZGlvIGxhIG1pdGFkIG8gbWVub3MgZGVsIHRpZW1wbyBhc2lnbmFkbyBwYXJhIHJlc3BvbmRlciB1bmEgc29saWNpdHVkDQoNCiMjIEJ1c3F1ZWRhIGRlIGNvcnJlbGFjaW9uZXMgDQoNCkxhIHNpZ3VpZW50ZSB0YWJsYSBub3MgbXVlc3RyYSB1biBjb21wb3J0YW1pZW50byBzZW5jaWxsbyBkZSBsYXMgdmFyYWlibGVzIGFsIGludGVyYWN0dWFyIGVudHJlIHNpLCBlc3RvIGNvbiBlbCBwcm9wb3NpdG8gZGUgZGFybm9zIHVuYSBpZGVhIGdlbmVyYWwgZGUgbGFzIHBvc2libGVzIGNvcnJlbGFjaW9uZXMgcXVlIHBvZHLDrWFuIGV4aXN0aXIsICB5IGRlIGVzdGEgZm9ybWEgYXNlZ3VyYXJub3MgcXVlIG5vIGZ1ZXJhbiBjYXVzYWRhcyBwb3IgZWwgYXphci4gDQpFbCBwcmltZXIgYW5hbGlzaXMgcXVlIGRlY2lkaW1vcyByZWFsaXphciwgcGFyYSBpbnRlbnRhciBvYnNlcnZhciBhbGd1bmEgcmVsYWNpb24gcG9zaWJsZSBjb24gb3RybyBkYXRvLCBmdWUgZW4gbGFzIG9yZGVuZXMgZGUgc2VydmljaW8gcXVlIG5vIGZ1ZXJvbiBhdGVuZGlkYXMgZW4gZWwgdGllbXBvIGFzaWduYWRvLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9DQoNCnBhaXJzLnBhbmVscyhjb3JyZWxhY2lvbl90aWVtcG9zMV9GYWxzLCBtZXRob2QgPSAic3BlYXJtYW4iKQ0KZ2djb3JycGxvdChjb3JyZWxhY2lvbl90aWVtcG9zMl9GYWxzLG1ldGhvZCA9ICdjaXJjbGUnLCB0eXBlID0gJ2xvd2VyJyxsYWIgPSBUUlVFKSsNCiAgZ2d0aXRsZSgiTWF0cml6IGRlIGNvcnJlbGFjacOzbiIpKw0KICB0aGVtZV9taW5pbWFsKCkNCmNvcnIudGVzdChjb3JyZWxhY2lvbl90aWVtcG9zMl9GYWxzLCBtZXRob2QgPSAic3BlYXJtYW4iLCBhZGp1c3QgPSAibm9uZSIpDQpgYGANClJlc3VsdGFkbyBkZSBsYXMgY29ycmVsYWNpb25lcyBlbnRyZSBsb3MgdGllbXBvcywgZGUgbGFzIG9yZGVuZXMgZGUgc2VydmljaW8gcXVlIGZ1ZXJvbiBhdGVuZGlkYXMgZW4gZWwgdGllbXBvIGFzaWduYWRvIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KcGFpcnMucGFuZWxzKGNvcnJlbGFjaW9uX3RpZW1wb3MxX1RydWUsIG1ldGhvZCA9ICJzcGVhcm1hbiIpDQpnZ2NvcnJwbG90KGNvcnJlbGFjaW9uX3RpZW1wb3MyX1RydWUsbWV0aG9kID0gJ2NpcmNsZScsIHR5cGUgPSAnbG93ZXInLGxhYiA9IFRSVUUpKw0KICBnZ3RpdGxlKCJNYXRyaXogZGUgY29ycmVsYWNpw7NuIikrDQogIHRoZW1lX21pbmltYWwoKQ0KY29yci50ZXN0KGNvcnJlbGFjaW9uX3RpZW1wb3MyX1RydWUsIG1ldGhvZCA9ICJzcGVhcm1hbiIsIGFkanVzdCA9ICJub25lIikNCmBgYA0KDQpMYXMgc2lndWllbnRlcyB0YWJsYXMgY29udGllbmVuIGNvcnJlbGFjaW9uZXMgZXNwZWNpZmljYXM6ICAqKkxSZXNwdWVzdGFfVFJlc3B1ZXN0YV9Db3IqKiwgcXVlIGNvbnN0YSBkZSBsYXMgdmFyaWFibGVzIGBUaWVtcG8gZGUgcmVzcHVlc3RhYCB5IGBMaW1pdGUgZGUgdGllbXBvIGRlIHJlc3B1ZXN0YWAsIGVuIHNlZ3VpZGEgZXN0w6EgbGEgY29sdW1uYSAgKipDYW52aXNpdGFzX1RSZXNwdWVzdGFfQ29yKiosIHF1ZSBzZSBjb25zdGl0dXllIGRlIGxhcyB2YXJpYWJsZXNgY2FudF92aXNpdGFzYCB5IGBUaWVtcG8gZGUgcmVzcHVlc3RhYC4gTGFzIGNvcnJlbGFjaW9uZXMgc2UgaGFjZW4gY29uIGVsIG1vZGVsbyBkZSAqU3BlYXJtYW4qLCB1dGlsaXphbmRvIGxvcyBkYXRvcyBxdWUgdGllbmVuIHVuIGNvZWZpY2llbnRlIGRlIHRpZW1wbyBkZSByZXNwdWVzdGEgeSBsaW1pdGUgZGUgdGllbXBvIGRlIHJlc3B1ZXN0YXMgbWF5b3IgbyBpZ3VhbCBhIDEgKGVzbyBxdWllcmUgZGVjaXIgcXVlIHV0aWxpemFyb24gdW4gbWF5b3IgdGllbXBvIGFsIGFzaWduYWRvKS4NCkxhcyAzIHRhYmxhcyBubyBtdWVzdHJhbiBjb3JyZWxhY2lvbmVzIGZpYWJsZXMgbyBxdWUgcG9kYW1vcyB0b21hciBjb21vIHVuYSBjb3JyZWxhY2nDs24gdsOhbGlkYSwgZW4gYWxndW5vcyBjYXNvcyBlc3RvIHNlIGRlYmUgYSBsYSBuYXR1cmFsZXphIGRlIGxvcyBtaXNtb3MgZGF0b3MsIGFkaWNpb25hbCBhIGVzdG8sIHNlIHB1ZWRlIHZlciBxdWUgbm8gZXhpc3RlbiBjb3JyZWxhY2lvbmVzIGxpbmVhbGVzIGVudHJlIGxhcyB2YXJpYWJsZXMgdXRpbGl6YWRhcy4gDQoNCg0KIyMgU2VyaWVzIGRlIHRpZW1wbw0KYGBge3J9DQpjb21wb25lbnRzKGRjbXBfSmFsKSAlPiUgYXV0b3Bsb3QoKSsgeGxhYigiTWVzZXMiKQ0KYGBgDQoNCmBgYHtyfQ0KY29tcG9uZW50cyhkY21wX0phbF9zZW0pICU+JSBhdXRvcGxvdCgpKyB4bGFiKCJTZW1hbmFzIikNCmBgYA0KDQoNCiMjIE1vZGVsb3MgDQoNCmBgYHtyfQ0KVHJhaW5fdHNiICU+JSANCiAgZmlsdGVyKFJ1dGEgPT0gIkpBTElTQ08iKSAlPiUgDQogIGZlYXR1cmVzKFRpZW1wb19kZV9yZXNwdWVzdGEsdW5pdHJvb3Rfa3BzcykNCmBgYA0KDQpgYGB7cn0NClRyYWluX3RzYiAlPiUgDQogIGZpbHRlcihSdXRhID09ICJKQUxJU0NPIikgJT4lIA0KICBmZWF0dXJlcyhUaWVtcG9fZGVfcmVzcHVlc3RhLCB1bml0cm9vdF9uZGlmZnMpDQoNClRyYWluX3RzYiAlPiUgDQogIGZpbHRlcihSdXRhID09ICJKQUxJU0NPIikgJT4lIA0KICBmZWF0dXJlcyhUaWVtcG9fZGVfcmVzcHVlc3RhLCB1bml0cm9vdF9uc2RpZmZzKQ0KYGBgDQoNCg0KYGBge3J9DQpUcmFpbl90c2IgJT4lIA0KICBmaWx0ZXIoUnV0YSA9PSAiSkFMSVNDTyIpICU+JSANCiAgbXV0YXRlKGRpZiA9IGRpZmZlcmVuY2UoVGllbXBvX2RlX3Jlc3B1ZXN0YSkpICU+JSANCiAgZmVhdHVyZXMoZGlmLHVuaXRyb290X2twc3MpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KVHJhaW5fdHNiICU+JSANCiAgZmlsdGVyKFJ1dGEgPT0gIkpBTElTQ08iKSAlPiUNCiAgbXV0YXRlKFRpZW1wb19kZV9yZXNwdWVzdGEgPSBkaWZmZXJlbmNlKFRpZW1wb19kZV9yZXNwdWVzdGEsIGRpZmZlcmVuY2VzID0gMSkpICU+JSANCiAgZ2dfdHNkaXNwbGF5KHBsb3RfdHlwZSA9ICdwYXJ0aWFsJykNCmBgYA0KDQpgYGB7cn0NCk1vZGVsb3NfZml0ICU+JSANCiAgc2VsZWN0KEFSSU1BX2ZvdXJpZXIyKSAlPiUgDQogIHJlcG9ydCgpDQpgYGANCg0KDQoNCkdyYWZpY2EgZGVsIHRlc3QgZGUgbG9zIG1vZGVsb3MNCg0KDQpgYGB7cn0NCk1vZGVsb3NfZmMgJT4lIA0KICAjIGZpbHRlcigubW9kZWwgPT0gIkFSSU1BX2ZvdXJpZXIyIikgJT4lIA0KICAjIGF1dG9wbG90KGZpbHRlcl9pbmRleChUcmFpbl90c2IsICIyMDIwLTAxLTAxIiB+ICIyMDIwLTEyLTA2IikpICsNCiAgYXV0b3Bsb3QoZmlsdGVyX2luZGV4KFRyYWluX3RzYiwgIjIwMjAtMDEtMDEiIH4gIjIwMjAtMTItMDYiKSwgbGV2ZWwgPSBOVUxMKSArDQogIGdndGl0bGUoIkVudHJlbmFtaWVudG8iKSArDQogIHhsYWIoIkHDsW9zIikgKyB5bGFiKCJob3JhcyIpICsNCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IkZvcmVjYXN0IikpKw0KICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXMuRGF0ZSgiMjAyMC0xMS0wOCIpLCBjb2xvciA9ICJSZWQiLA0KICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKSsNCiAgYW5ub3RhdGUoImxhYmVsIiwgeCA9IGMoYXMuRGF0ZSgiMjAyMC0wOC0wMSIpLGFzLkRhdGUoIjIwMjAtMTItMDEiKSksDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gMy41LCBsYWJlbCA9IGMoIlRyYWluIHNldCIsICJUZXN0IHNldCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjKCJibGFjayIsImJsdWUiKSkNCmBgYA0KDQpgYGB7cn0NClRyYWluX3RzYiAlPiUgDQogIGZpbHRlcl9pbmRleCgiMjAyMC0wMS0wMSIgfiAiMjAyMC0xMi0wNiIpICU+JSANCiAgZmlsdGVyKFJ1dGEgPT0gIkpBTElTQ08iKSAlPiUgDQogIGF1dG9wbG90KFRpZW1wb19kZV9yZXNwdWVzdGEpICsgDQogIGF1dG9sYXllcihNb2RlbG9zX2ZjICU+JSBmaWx0ZXIoLm1vZGVsID09ICJkeW5hbWljX3JlZyIpLCBsZXZlbCA9IE5VTEwpDQpgYGANCg0KDQpgYGB7cn0NCk1vZGVsb3NfZmMgJT4lIA0KICBmaWx0ZXIoLm1vZGVsICVpbiUgYygiZHluYW1pY19yZWciKSkgJT4lIA0KICBhdXRvcGxvdChmaWx0ZXJfaW5kZXgoVHJhaW5fdHNiLCAiMjAyMC0wMS0wMSIgfiAiMjAyMC0xMi0wNiIpKSArDQogICMgYXV0b3Bsb3QoZmlsdGVyX2luZGV4KFRyYWluX3RzYiwgIjIwMjAtMDEtMDEiIH4gIjIwMjAtMTItMDYiKSwgbGV2ZWwgPSBOVUxMKSArDQogIGdndGl0bGUoIkVudHJlbmFtaWVudG8iKSArDQogIHhsYWIoIkHDsW9zIikgKyB5bGFiKCJob3JhcyIpICsNCiAgZ3VpZGVzKGNvbG91cj1ndWlkZV9sZWdlbmQodGl0bGU9IkZvcmVjYXN0IikpKw0KICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXMuRGF0ZSgiMjAyMC0xMS0wOCIpLCBjb2xvciA9ICJSZWQiLA0KICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKSsNCiAgYW5ub3RhdGUoImxhYmVsIiwgeCA9IGMoYXMuRGF0ZSgiMjAyMC0wOC0wMSIpLGFzLkRhdGUoIjIwMjAtMTItMDEiKSksDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gMy41LCBsYWJlbCA9IGMoIlRyYWluIHNldCIsICJUZXN0IHNldCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBjKCJibGFjayIsImJsdWUiKSkNCmBgYA0KDQoNCkFuYWxpc2lzIGVzdGFkaXN0aWNvIGRlIGxvcyBtb2RlbG9zICANCg0KDQpgYGB7cn0NCkVycm9yX3Rlc3QgJT4lIA0KICBzZWxlY3QoLm1vZGVsOi50eXBlLCBSTVNFLCBNQUUsIE1BUEUsIE1BU0UpICU+JSANCiAgYXJyYW5nZShSTVNFKQ0KYGBgDQoNCg0KDQojIEJpYmxpb2dyYWZpYSAvIFJlZmVyZW5jaWFzIA0KDQoNCiogTGVuZ3VhamUgZGUgcHJvZ3JhbWFjaW9uOg0KICBodHRwczovL3d3dy5yLXByb2plY3Qub3JnDQogIC8NCiogQW1iaWVudGUgZGUgcHJvZ3JhbWFjaW9uOg0KICBodHRwczovL3JzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvDQoNCiogUGFnaW5hIGRlIGluaWNpbyBkZSBlc3R1ZGlvcw0KICBodHRwczovL3I0ZHMtZW4tZXNwYW5pb2wubmV0bGlmeS5hcHANCg0KKiBQcmluY2lwaW9zIGJhc2ljb3MgZGUgbGFzIHNlcmllcyBkZSB0aWVtcG8NCiAgaHR0cHM6Ly9ib29rZG93bi5vcmcvY29udGVudC8yMjc0L3Nlcmllcy10ZW1wb3JhbGVzLmh0bWwNCiAgaHR0cHM6Ly9vdGV4dHMuY29tL2ZwcDIvDQoNCiogQXl1ZGEgZGUgbW9kZWxvcyBlbiBSDQogIGh0dHBzOi8vZ2l0aHViLmNvbS90aWR5bW9kZWxzDQogIGh0dHBzOi8vd3d3LnRpZHltb2RlbHMub3JnLw0KICAgIA0K